﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Sistema.Util.Interfaces;
using Sistema.Dominio;
using Sistema.IDAO;

namespace Sistema.Kernel
{
    public class Usuario : ICadastro<UsuarioInfo>
    {
        IUsuarioDAO _repositorio;

        public Usuario()
        {
            this._repositorio = DAOFactoryIoC.ObterDaoFactory().GetReference<IUsuarioDAO>();
        }

        public void Cadastrar(UsuarioInfo dados)
        {
            try
            {
                if (!this.VerificaSejaCadastrado(dados))
                {
                    this._repositorio.Salvar(dados);
                }
            }
            catch (KernelException)
            {
                throw new KernelException("Ja existe um usuario no bd com este mesmo cpf.", "Este usuario ja esta cadastrado no banco de dados");
            }

        }

        public void Alterar(UsuarioInfo dados)
        {
            try
            {

                if (!String.IsNullOrWhiteSpace(dados.ID.ToString()))
                {
                    this._repositorio.Alterar(dados);
                }
            }
            catch (KernelException)
            {
                throw new KernelException("Este Usuario nao e cadastrado no banco pois nao possui um ID", "Usuario informado invalido pois ainda n e cadastrado");
            }
        }

        public void Excluir(UsuarioInfo dados)
        {
            this._repositorio.Excluir(dados);
        }

        public UsuarioInfo Buscar(Int32 Id)
        {
            return this._repositorio.Buscar(Id);
        }

        public IList<UsuarioInfo> PesquisarUsuario(enumTipoPesquisaUsuario tipoPesquisa, String DadosConsulta)
        {
            return this.Listar();
        }

        public IList<UsuarioInfo> Listar()
        {
            return this._repositorio.Listar();
        }

        public bool VerificaSejaCadastrado(UsuarioInfo dadosVerificacao)
        {
            return this._repositorio.VerificaSeJaCadastrado(dadosVerificacao);
        }

        public Tuple<Boolean, UsuarioInfo> Logar(LoginVO dados)
        {
            Tuple<Boolean, UsuarioInfo> retorno;
            UsuarioInfo resultadoConsulta;
            resultadoConsulta = this._repositorio.PerquisaPorLogin(dados);
            retorno = new Tuple<bool, UsuarioInfo>(resultadoConsulta == null ? false : true, resultadoConsulta);
            return retorno;
        }
    }

    public enum enumTipoPesquisaUsuario
    {
        Nome,
        Cpf
    }
}
